/**
 * 
 */
package cn.biplam.front.template.control.rfFlowTable.callback.action;

import java.util.ArrayList;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.Result;
import cn.biplam.front.template.control.table.TableScript.Action_Type;


/**
 * 创建Ajx提交脚本的回调类
 * @author 	WangSong 2009-11-5 上午10:55:50
 * @version 1.0
 */
public abstract class ActionCallback {
	
	/** ajx提交动作类型 */
	private Callback_Action_Type type;
	/** 动作ID */
	private String actionId;
	/** 提交附加容器ID */
	private String otherCid;
	/** 目标容器ID */
	private String targetId;
	/** 附加参数 */
	private ArrayList<String> addParams;
	/** 当前动作的记录ID字段,提交时记录值为当前字段的值 */
	private String keyFieldName;
	/** 当前脚本模式 */
	private Action_Model curModel = Action_Model.Standard;
	
	/**
	 * 脚本提交动作类型
	 */
	public enum Callback_Action_Type{
		A,
		M,
		P,
		Pr,
		Sp,
		Pv;
	}
	
	/**
	 * 提交脚本动作类型<BR>
	 * 标准的Ajx脚本提交,自定义脚本
	 */
	public enum Action_Model{
		/** 标准的Ajx脚本提交 */
		Standard,
		/** 自定义脚本 */
		Custom
	}
	
	/**
	 *  设置动作类型
	 * @param type
	 */
	protected void setType(Callback_Action_Type type){
		this.type = type;
	}
	
	/**
	 *  设置动作ID
	 * @param actionId 动作ID
	 */
	protected void setActionId(String actionId){
		this.actionId = actionId;
	}
	
	/**
	 *  设置类型
	 * @param type 类型
	 * @throws ErrorMessage
	 */
	protected void setType(String type) throws ErrorMessage{
		if(type.equals(Callback_Action_Type.A.toString())){
			this.type = Callback_Action_Type.A;
		}else if(type.equals(Callback_Action_Type.M.toString())){
			this.type = Callback_Action_Type.M;
		}else if(type.endsWith(Callback_Action_Type.P.toString())){
			this.type = Callback_Action_Type.P;
		}else if(type.equals(Callback_Action_Type.Pr.toString())){
			this.type = Callback_Action_Type.Pr;
		}else if(type.equals(Callback_Action_Type.Sp.toString())){
			this.type = Callback_Action_Type.Sp;
		}else if(type.equals(Callback_Action_Type.Pv.toString())){
			this.type = Callback_Action_Type.Pv;
		}else{
			throw new ErrorMessage(" Action type is unknow!");
		}
	}
	
	/**
	 *  脚本回调器自定义逻辑接口(根据不同数据信息设置不同的脚本提交)
	 *  根据数据逻辑设置: type , actionId, otherCid , targetId , addParam
	 * @param result 数据信息
	 */
	public abstract void process(Result result);
	
	/**
	 *  设置其他容器ID 
	 * @param otherCid 其他容器ID
	 */
	protected void setOtherContainer(String otherCid){
		this.otherCid=otherCid;
	}
	
	/**
	 *  设置目标容器ID
	 * @param targetId
	 */
	protected void setTarget(String targetId){
		this.targetId=targetId;
	}

	/**
	 *  放入附加参数
	 * @param addParam 附加参数
	 */
	protected void putAddParam(String addParam){
		if(this.addParams==null)
			this.addParams=new ArrayList<String>();
		this.addParams.add(addParam);
	}
	
	/**
	 *  设置附加提交参数
	 * @param addParams
	 */
	protected void setAddParams(String... addParams){
		for(String param:addParams){
			this.putAddParam(param);
		}
	}
	
	/**
	 * @return 动作ID
	 */
	public String getActionId(){
		return this.actionId;
	}
	
	/**
	 * @return 动作类型
	 * @throws ErrorMessage
	 */
	public Action_Type getActionType() throws ErrorMessage{
		if(this.type==null)throw new ErrorMessage("Action Type is not exist at ActionCallback!");
		switch (this.type) {
		case A:
			return Action_Type.NONE_POPE_SUBMIT;
		case M:
			return Action_Type.NONE_POPE_M;
		case P:
			return Action_Type.POP_SUBMIT_P;
		case Pr:
			return Action_Type.POP_SUBMIT_PR;
		case Sp:
			return Action_Type.SP;
		case Pv:
			return Action_Type.POP_SUBMIT_PV;
		default:
			throw new ErrorMessage("Action type unknow!");
		}
	}
	
	/**
	 *  
	 * @return 目标容器ID
	 */
	public String getTargetId(){
		return this.targetId;
	}
	
	/**
	 *  
	 * @return 其他容器
	 */
	public String getOtherContainer(){
		return this.otherCid;
	}
	
	/**
	 *  
	 * @return 附加参数
	 */
	public String[] getAddParams(){
		if(this.addParams==null)return new String[0];//如果当前提交无附加参数返回空数组
		String[] params = new String[this.addParams.size()];
		return this.addParams.toArray(params);
	}

	/**
	 *  获取当前单元格的记录ID
	 * @param result 记录集
	 * @param rowRecordId 当前行主键记录ID
	 * @return 如果设置了当前单元格的记录ID字段返回记录ID字段的值,否则返回行记录ID
	 * @throws ErrorMessage 
	 */
	public String getRecordId(Result result,String rowRecordId) throws ErrorMessage{
		if(keyFieldName==null)return rowRecordId;
		return result.getString(keyFieldName);
	}

	/**
	 *  获取自定义脚本(调用前先调用getIsCustomerModel判断是否是自定义脚本模式,是子定义脚本模式才有意义)
	 * @param result       记录集
	 * @param rowRecordId  当前行主键记录ID
	 * @return 自定义脚本
	 * @throws ErrorMessage 
	 */
	public abstract String getCustomerScript(Result result, String rowRecordId) throws ErrorMessage;
	
	/**
	 * @return 返回当前脚本是否是自定义脚本模式
	 */
	public boolean isCustomerModel(){
		return this.curModel == Action_Model.Custom;
	}
	
	/**
	 *  设置当前模式为非标准自定义脚本模式
	 */
	public void setCustomerModel(){
		this.curModel = Action_Model.Custom;
	}
	
	/**
	 *  设置单元格提交事情记录ID来自的字段
	 * @param keyFieldName 单元格提交事情记录ID来自的字段
	 */
	public void setKeyFieldName(String keyFieldName) {
		this.keyFieldName = keyFieldName;
	}
}
